table of contents
ERRNO(3) | Funkcje biblioteczne | ERRNO(3) |
NAZWA¶
errno - numer ostatniego błędu
SKŁADNIA¶
#include <errno.h>
OPIS¶
Plik nagłówkowy <errno.h> definiuje zmienną całkowitą errno, która jest ustawiana w razie błędu przez wywołania systemowe oraz pewne funkcje biblioteczne tak, aby zaznaczyć, co poszło źle. Wartość ta jest istotna tylko gdy wywołanie zwróciło błąd (zwykle -1), ale funkcja biblioteczna, która zakończyła się sukcesem, także może zmienić errno.
Czasami, gdy -1 jest także poprawną wartością zwracaną, aby wykryć błędy należy przed wywołaniem wyzerować errno.
errno jest definiowana przez standard ISO C jako modyfikowalna l-wartość typu int, które nie może zostać jawnie zadeklarowana; errno może być makrem. Wartość errno jest lokalna w obrębie wątku, jej zmiana w jednym wątku nie wpływa na wartość w innym.
Wszystkie poprawne numery błędów są różne od zera, funkcja biblioteczna nigdy nie przypisuje errno zera. Każdej nazwie błędu określonej przez POSIX.1 musi odpowiadać inna wartość z wyjątkiem EAGAIN i EWOULDBLOCK, które mogą mieć tę samą wartość.
POSIX.1 (wydanie z 2001 roku) wyszczególnia następujące symboliczne nazwy błędów. Dwie z nich EDOM oraz ERANGE są zawarte także w standardzie ISO C. Pierwsza poprawka ISO C definiuje dodatkowy numer błędu EILSEQ dla kodowania błędów w wielobajtowych lub szerokich znakach.
- E2BIG
- Lista argumentów za długa
- EACCES
- Brak dostępu
- EADDRINUSE
- Adres jest używany
- EADDRNOTAVAIL
- Adres niedostępny
- EAFNOSUPPORT
- Niewspierana rodzina adresów
- EAGAIN
- Zasoby chwilowo niedostępne
- EALREADY
- Połączenie trwa
- EBADF
- Błędny deskryptor pliku
- EBADMSG
- Błędny komunikat
- EBUSY
- Zasób zajęty
- ECANCELED
- Operacja anulowana
- ECHILD
- Brak procesów potomnych
- ECONNABORTED
- Połączenie przerwane
- ECONNREFUSED
- Odmowa połączenia
- ECONNRESET
- Połączenie zrestartowane
- EDEADLK
- Uniknięto zakleszczenia zasobów
- EDESTADDRREQ
- Wymagany jest adres docelowy
- EDOM
- Błąd dziedziny
- EDQUOT
- Zarezerwowane
- EEXIST
- Plik istnieje
- EFAULT
- Błędny adres
- EFBIG
- Plik jest za duży
- EHOSTUNREACH
- Host jest nieosiągalny
- EIDRM
- Usunięto identyfikator
- EILSEQ
- Nieprawidłowa kolejność bajtów
- EINPROGRESS
- Operacja jest już wykonywana
- EINTR
- Przerwane wywołanie funkcji
- EINVAL
- Zły argument
- EIO
- Błąd wejścia/wyjścia
- EISCONN
- Gniazdo jest połączone
- EISDIR
- Jest katalogiem
- ELOOP
- Za dużo poziomów dowiązań symbolicznych
- EMFILE
- Za dużo otwartych plików
- EMLINK
- Za dużo dowiązań
- EMSGSIZE
- Nieodpowiednia długość bufora komunikatów
- EMULTIHOP
- Zarezerwowane
- ENAMETOOLONG
- Za długa nazwa pliku
- ENETDOWN
- Sieć jest wyłączona
- ENETRESET
- Połączenie przerwane przez sieć
- ENETUNREACH
- Sieć jest niedostępna
- ENFILE
- Za dużo otwartych plików w systemie
- ENOBUFS
- Brak dostępnej przestrzeni buforów
- ENODATA
- Brak komunikatów w nagłówku czytanej kolejki STREAM
- ENODEV
- Nie ma takiego urządzenia
- ENOENT
- Nie ma takiego pliku ani katalogu
- ENOEXEC
- Błędny format pliku wykonywalnego
- ENOLCK
- Brak dostępnych blokad
- ENOLINK
- Zarezerwowane
- ENOMEM
- Brak miejsca
- ENOMSG
- Brak komunikatów zadanego rodzaju
- ENOPROTOOPT
- Protokół jest niedostępny
- ENOSPC
- Brak miejsca na urządzeniu
- ENOSR
- Brak zasobów STREAM
- ENOSTR
- To nie jest STREAM
- ENOSYS
- Niezaimplementowana funkcja
- ENOTCON
- Gniazdo nie jest połączone
- ENOTDIR
- To nie jest katalog
- ENOTEMPTY
- Katalog nie jest pusty
- ENOTSOCK
- To nie jest gniazdo
- ENOTSUP
- Niedostępne
- ENOTTY
- Nieodpowiednia operacja kontroli wejścia/wyjścia
- ENXIO
- Brak urządzenia lub adresu
- EOPNOTSUPP
- Operacja niedozwolona na gnieździe
- EOVERFLOW
- Wartość za duża dla typu danych
- EPERM
- Operacja niedozwolona
- EPIPE
- Przerwany potok
- EPROTO
- Błąd protokołu
- EPROTONOSUPPORT
- Protokół nie wspierany
- EPROTOTYPE
- Niewłaściwy rodzaj protokołu dla gniazda
- ERANGE
- Rezultat zbyt duży
- EROFS
- System plików wyłącznie do odczytu
- ESPIPE
- Nieprawidłowe przesunięcie
- ESRCH
- Nie ma takiego procesu
- ESTALE
- Zarezerwowane
- ETIME
- Timeout ioctl() dla STREAM
- ETIMEDOUT
- Operacja przeterminowana
- ETXTBSY
- Plik tekstowy jest zajęty
- EWOULDBLOCK
- Operacja blokująca (może to być ta sama wartość, co dla EAGAIN)
- EXDEV
- Nieprawidłowe dowiązanie
UWAGI¶
Powszechnym błędem jest robienie
if (somecall() == -1) {
printf("somecall() zwróciło błąd\n");
if (errno == ...) { ... } }
if (somecall() == -1) {
int errsv = errno;
printf("somecall() zwróciło błąd\n");
if (errsv == ...) { ... } }
Powszechnie w tradycyjnym C deklarowało się ręcznie errno (np. extern int errno) zamiast włączać plik <errno.h>. Nie rób tego. To nie będzie działało z nowoczesnymi wersjami biblioteki C. Jednakże na (bardzo) starych systemach Unix, <errno.h> może nie istnieć i ta deklaracja będzie potrzebna,
ZOBACZ TAKŻE¶
2004-12-17 |